/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ejemplotiendaweb.controlador;

import ejb.datos.ClienteFacadeRemote;
import ejb.datos.ProductoFacadeRemote;
import ejb.negocio.CatalogoFacadeRemote;
import ejb.negocio.CompraFacadeRemote;
import ejemplotiendaweb.ControladorGeneral;
import ejemplotiendawebswing.Compra;
import ejemplotiendawebswing.Principal;
import entidades.Familia;
import entidades.Producto;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author ccia
 */
public class PrincipalController extends ControladorGui<Principal> {
    private CatalogoFacadeRemote catalogoFacade;
    private ProductoFacadeRemote productoFacade;
    private CompraController controladorCompra;
    private List<Producto> listaProductos;

    public PrincipalController(Principal gui, CatalogoFacadeRemote catalogoFacade,
            ProductoFacadeRemote productoFacade, CompraFacadeRemote modeloCompra, ClienteFacadeRemote clienteFac) {
        super(gui);
        this.catalogoFacade = catalogoFacade;
        this.productoFacade = productoFacade;
        this.controladorCompra = new CompraController(new Compra(gui, false), modeloCompra, clienteFac, this);
    }

    public void inicializar() {
        rellenarTabla();
        llenarComboFiltros();
        controladorCompra.inicializar();
    }

    @Override
    public void mostrar() {
        super.mostrar();
        controladorCompra.mostrar();
    }

    private void llenarTabla() {
        DefaultTableModel tableModel = gui.getModeloTabla();
        tableModel.setRowCount(0);

        for (Producto producto : listaProductos) {
            Object[] row = {
                producto.getDescripcion(),
                producto.getDetalle(),
                producto.getPrecio(),
                producto.getExistencias(),
                producto.getMarca(),
                producto.getModelo(),
                (producto.getFamilia() != null) ? producto.getFamilia().getNombre() : "-"
            };
            tableModel.addRow(row);
        }

    }

    public void dialogoFamilias() {
        ControladorGeneral.mostrarDialogoFamilias(gui);
    }

    public void crearProducto() {
        ControladorGeneral.mostrarDialogoProductos(gui);
        rellenarTabla();
    }

    void rellenarTabla() {
        listaProductos = catalogoFacade.productos();
        llenarTabla();
        gui.resetFiltros();
    }

    public void eliminarProducto(int selectedRow) {
        if (selectedRow == -1) {
            mensajeError("No ha seleccionado una fila de la tabla");
            return;
        }
        Producto producto = listaProductos.get(selectedRow);
        productoFacade.eliminar(producto);
        rellenarTabla();
    }

    public void editarProducto(int selectedRow) {
        if (selectedRow == -1) {
            mensajeError("No ha seleccionado una fila de la tabla");
            return;
        }
        ControladorGeneral.mostrarDialogoProductos(gui, listaProductos.get(selectedRow));
        llenarTabla();
    }

    private void llenarComboFiltros() {
        JComboBox combo = gui.getComboFiltros();
        combo.removeAllItems();
        for (FiltroProducto fp : FiltroProducto.values()) {
            combo.addItem(fp);
        }
    }

    public void filtrar(String filtro) {
        //sin filtro
        if (!validarCadenaVacia(filtro)) {
            rellenarTabla();
            return;
        }

        FiltroProducto fp = (FiltroProducto) gui.getComboFiltros().getSelectedItem();

        switch (fp) {
            case MARCA:
                listaProductos = catalogoFacade.productosPorMarca(filtro);
                break;
            case DESCRIPCION:
                listaProductos = catalogoFacade.productosPorDescripcion(filtro);
                break;
            case FAMILIA:
                List<Producto> listaFinal = new LinkedList<Producto>();

                List<Familia> familias = catalogoFacade.familiasPorNombre(filtro);

                for (Familia f : familias) {
                    List<Producto> busqueda = catalogoFacade.productosPorFamilia(f.getId());
                    listaFinal.addAll(busqueda);
                }

                listaProductos = listaFinal;
                break;
        }
        llenarTabla();
    }

    public void comprar(int selectedRow) {
        if (selectedRow == -1) {
            mensajeError("No ha seleccionado una fila de la tabla");
            return;
        }

        Producto producto = listaProductos.get(selectedRow);

        String entrada = JOptionPane.showInputDialog(gui, "Ingrese cantidad", "0", JOptionPane.INFORMATION_MESSAGE);

        if (entrada == null) {
            mensajeError("Cantidad no válida");
            return;
        }

        int cantidad = 0;
        try {
            cantidad = Integer.parseInt(entrada);
        } catch (NumberFormatException ex) {
            mensajeError("La cantidad ingresada debe ser numérica y entera");
            return;
        }

        controladorCompra.comprar(producto, cantidad);
    }
}
